<?php

if (!defined('BASEPATH'))
    exit('No direct script access allowed');

    require_once APPPATH . 'dao/CobradorZonaDAO.php';
    require_once APPPATH . 'dao/SocioDAO.php';
    require_once APPPATH . 'dao/CobradorDAO.php';
    require_once APPPATH . 'dao/CuponDAO.php';
    require_once APPPATH . 'dao/SocioServicioAdicionalDAO.php';

class MY_Form_Validation extends CI_Form_Validation {

    function __construct() {
        parent::__construct();
    }

    /**
     * Función de seguridad para utilizar como regla de Form Validation en CI.
     * Escapa los caracteres especiales (PostgreSQL, para MySQL ver
     * mysql_real_escape_string) y determina si el campo contiene palabras no
     * permitidas, en cuyo caso devuelve FALSE en la validación.
     *
     * @param <type> $str
     * @return <type>
     */
    public function cleanQuery($str) {

        //Obtiene la instancia de CI y establece el mensaje en caso de error.
        $CI = & get_instance();
        $CI->form_validation->set_message('cleanQuery', 'El %s contiene caracteres inválidos.');

        //Si los caracteres especiales son automáticamente escapados, los "des-escapa".
        if (get_magic_quotes_gpc ()) {
            $str = stripslashes($str);
        }

        //Establece una conexión con la base de datos para obtener la versión de
        //PostgreSQL.
        
        $db_conn = pg_connect("host=localhost port=5432 dbname=MetodosDB user=postgres password=agu123");
        $pg_version = pg_version($db_conn);

        //Si la versión de PHP es mayor o igual a la 4.2.0 y la de PostgreSQL mayor
        //o igual a la 7.2 entonces se puede utilizar pg_escape_string, sino se utiliza
        //addslashes.
        if (phpversion() >= '4.2.0' && $pg_version['client'] >= '7.2') {
            $str = pg_escape_string($str);
        } else {
            $str = addslashes($str);
        }

        //Elimina tags HTML.
        $str = strip_tags($str);

        //Arreglo de palabras no permitidas.
        $invalidKeywords = array('select', 'from', 'where', 'union', 'insert',
            'update', 'join', 'create', 'delete');

        //Por cada palabra del arreglo, determina si aparece en la cadena. En ese caso,
        //retorna FALSE.
        for ($i = 0; $i < count($invalidKeywords); $i++) {
            $injection = stripos($str, $invalidKeywords[$i]);
            if (is_numeric($injection))
                return FALSE;
        }

        //Sino, retorna TRUE.
        return TRUE;
    }

    /**
     * Función para la validación de campos con codeigniter. Valida que el valor
     * del campo sea unique en la base de datos.
     *
     * @param <type> $str El texto contenido en el campo.
     * @param <type> $params Un string, que representa una lista de parametros. Cada
     *                       parámetro va separado por coma, sin espacios. En este
     *                       caso se deben pasar 3 parametros: el nombre del modelo,
     *                       el nombre del campo y el tipo (string o integer).
     * @return <type> TRUE si es unique, FALSE caso contrario.
     */
    public function unique($str, $params) {

        //Obtiene la instancia de CI y establece el mensaje en caso de error.
        $CI = & get_instance();
        $CI->form_validation->set_message('unique', 'El %s ya existe en la base de datos.');

        //Separa los 3 parametros en las variables $model, $field y $type.
        list($model, $field, $type) = explode(',', $params, 3);

        //Crea una instancia del parametro $model.
        $instance = new $model();

        //Con esta instancia, llama a la funcion existe del modelo, la cual se
        //encargará de validar si efectivamente el campo es unique. Se le pasa como
        //parametros el valor del campo, el nombre del campo y el tipo (string o
        //integer).
        $yaExiste = $instance->existe($str, $field, $type);
        
        //Si ya existe, retorna FALSE y la validación falla. Sino retorna TRUE.
        if ($yaExiste) {
            return FALSE;
        } else {
            return TRUE;
        }
    }
    //Valida que el campo que se esta ingresando ya exista en la base de datos
    public function notUnique($str, $params) {
        
        $CI = & get_instance();
        $CI->form_validation->set_message('notUnique', 'No existe el %s ingresado.');
        
        return !$this->unique($str, $params);
        
    }
    
    //Valida que el cupon que se esta devolviendo este como 'no pagado' 
    //Para utilizarlo se debe previamente validar la existencia del cupon
    public function noPagado($str) {
        //Obtiene la instancia de CI y establece el mensaje en caso de error.
        $CI = & get_instance();
//        echo('lalala');
        $CI->form_validation->set_message('noPagado', 'El %s ingresado corresponde a uno pagado.');
        $cuponDao = new \CuponDAO();
        return $cuponDao->existeCuponNoPagado($str);
        
    }
    
    //Se encarga de verificar que no se esté queriendo registrar el pago de un cupón posterior
    //al más más proximo a vencer
    
    
    public function cuponNoDevuelto ($str){
        
        $cuponDAO = new \CuponDAO();
        $cupon = $cuponDAO->getCuponByID($str);
        $msjError = 'El cupón N° '.$cupon->getID().' ya ha sido devuelto';
        $CI = & get_instance();
        $CI->form_validation->set_message('cuponNoDevuelto', $msjError);
   
        return $cupon->getDevuelto() ? FALSE : TRUE ;
                
                
        
        
    }
    public function cuponNoPagado ($str){
        $cuponDAO = new \CuponDAO();
        $cupon = $cuponDAO->getCuponByID($str);
        $msjError = 'El cupón N° '.$cupon->getID().' no puede ser devuelto porque ya ha sido pagado';
        $CI = & get_instance();
        $CI->form_validation->set_message('cuponNoPagado', 'No se puede devolver un Cupón que esta pagado.');
        
        
        return $cupon->getPagado() ? FALSE : TRUE ;
                
                
        
        
    }
    public function cuponOrdenado($str) {
        
        //Obtiene la instancia de CI y establece el mensaje en caso de error.
        $CI = & get_instance();
        $CI->form_validation->set_message('cuponOrdenado', 'Existe un cupón pendiente de pago anterior al ingresado.');
   
        $cuponDAO = new \CuponDAO();
        $cupon = $cuponDAO->getCuponByID($str);
        
        $cuponesNoPagadosSocio = $cuponDAO->getCuponesNoPagadosBySocio($cupon->getSocio()->getId());
        
        foreach($cuponesNoPagadosSocio as $cuponNoPagado){
            
            if(!$cuponNoPagado->getDevuelto() && ($cuponNoPagado->getFechaVencimiento() > $cupon->getFechaVencimiento()))
                return FALSE;
        }
        
        return TRUE;
        
    }

    /**
     * Función para la validación de campos con codeigniter. Valida que el campo
     * sólo contenga letras, números o espacios.
     *
     * @param <type> $str El texto contenido en el campo.
     * @return <type>  TRUE si es satisfactorio, FALSE caso contrario.
     */
    public function alphanumericSpace($str)
    {
        //Obtiene la instancia de CI y establece el mensaje en caso de error.
        $CI = & get_instance();
        $CI->form_validation->set_message('alphanumericSpace',
                'El campo %s s&oacute;lo debe contener caracteres alfanum&eacute;ricos y espacios.');
        
        return ( ! preg_match('/^[a-zA-Z0-9ñÑáéíóúÁÉÍÓÚäëïöüÄËÏÖÜ ]*$/', $str)) ? FALSE : TRUE;
    }

    public function alphaApostropheSpace($str) {
        //Obtiene la instancia de CI y establece el mensaje en caso de error.
        $CI = & get_instance();
        $CI->form_validation->set_message('alphaApostropheSpace', 'El campo %s s&oacute;lo debe contener caracteres alfab&eacute;ticos,
                    acentos, ap&oacute;strofes y espacios.');

        return (!preg_match('/^[a-zA-ZñÑáéíóúÁÉÍÓÚäëïöüÄËÏÖÜ\' ]*$/', $str)) ? FALSE : TRUE;
    }
    
    public function alphaApostropheSpaceNum($str) {
        //Obtiene la instancia de CI y establece el mensaje en caso de error.
        $CI = & get_instance();
        $CI->form_validation->set_message('alphaApostropheSpaceNum', 'El campo %s s&oacute;lo debe contener caracteres alfab&eacute;ticos,
                    acentos, ap&oacute;strofes y espacios.');

        return (!preg_match('/^[a-zA-Z0-9ñÑáéíóúÁÉÍÓÚäëïöüÄËÏÖÜ.\' ]*$/', $str)) ? FALSE : TRUE;
    }
    public function rangoZona($str) {
        //Obtiene la instancia de CI y establece el mensaje en caso de error.
        $CI = & get_instance();
        $CI->form_validation->set_message('rangoZona', 'El campo %s debe estar entre 0 y 10.');

        return ($str >= '0' && $str <= '10') ? true : False;
        
    }
    
    public function requerido($str) {
        //Obtiene la instancia de CI y establece el mensaje en caso de error.
        $CI = & get_instance();
        $CI->form_validation->set_message('requerido', 'El campo %s es obligatorio.');

        return (trim($str) == 0) ? FALSE : TRUE;
        
    }
    
    public function formatoNumeroDeZona($str){
        $CI = & get_instance();
        $CI->form_validation->set_message('formatoNumeroDeZona', 'El campo %s debe tener 1 o 2 dígitos');
        return (!preg_match('/^\d{1,2}$/', $str)) ? FALSE : TRUE;
    }
    
    public function formatoNumeroDeDocumento ($str){
        $CI = & get_instance();
        $CI->form_validation->set_message('formatoNumeroDeDocumento', 'El campo %s debe tener 7 u 8 numeros');
        return (!preg_match('/^\d{7,8}$/', $str)) ? FALSE : TRUE;

    }
    
    public function formatoNumeroCupon($str){
        $CI = & get_instance();
        $CI->form_validation->set_message('formatoNumeroCupon', 'El %s debe tener entre 1 y 8 numeros');
        return (!preg_match('/^\d{1,8}$/', $str)) ? FALSE : TRUE;
    }
    
     public function menorNumeroDeDocumentoPosible ($str){
        $CI = & get_instance();
        $CI->form_validation->set_message('menorNumeroDeDocumentoPosible', 'El campo %s debe ser mayor a 4000000.');
        return ($str < '4000000' ) ? FALSE : TRUE;

    }
    public function validar_formato($fecha){
        $CI = & get_instance();
        $CI->form_validation->set_message('validar_formato', 'Ingrese una %s con formato dd/mm/aaaa.');
        
        return (!preg_match('/^\d{1,2}\/\d{1,2}\/\d{4}$/', $fecha)) ? FALSE : TRUE;
        
    }
    
    public function validar_fecha($fecha){
        
        $CI = & get_instance();
        $CI->form_validation->set_message('validar_fecha', 'Ingrese una %s válida.');
        
        list($diaNac,$mesNac,$anioNac) = explode("/",$fecha);
        
        if(isset($diaNac) && isset($mesNac) && isset($anioNac))
            return checkdate($mesNac, $diaNac, $anioNac);
        else
            return FALSE;
        
    }
    
    public function validar_nacimiento($fechaString){
        
        $CI = & get_instance();
        $CI->form_validation->set_message('validar_nacimiento', 'Ingrese una %s válida.');
        
        $fechaDate = new DateTime($fechaString);
        $fechaMax = new DateTime(date('Y-m-d'));
        $fechaMin = new DateTime(date('Y-m-d',mktime(0, 0, 0, date("m")+1, date("d"), date("Y")-90)));
        
        return ($fechaMin < $fechaDate && $fechaDate < $fechaMax);
        
    }
    
    public function validar_monto_recaudado($str, $param){
        
        $CI = & get_instance();
        $CI->form_validation->set_message('validar_monto_recaudado', 'La Recaudación en %s no es correcta.');
        
        $cuponDAO = new \CuponDAO();
        $cuponesNoDevueltosEnZona = $cuponDAO->getCuponesNoDevueltosEnZona($param);
        
        $total = 0;
        if($cuponesNoDevueltosEnZona !== FALSE){
            
            $socioServAd = new \SocioServicioAdicionalDAO();
            
            foreach($cuponesNoDevueltosEnZona as $cuponNoDevuelto){
                
                $total += (int)$cuponNoDevuelto->getSocio()->getCategoria()->getImporte();
                
                $servicios = $socioServAd->getServiciosDeSocio($cuponNoDevuelto->getSocio()->getId(), 
                                                        $cuponNoDevuelto->getSocio()->getCategoria()->getId());
                
                foreach($servicios as $servicio){
                    
                    $total += (int)$servicio['importe'];
                    
                }
                
            }
            
        }
        
        return ($total == (int)$str);
        
    }

}

?>
